﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using vudu.Presentacion.Contrato.VU_02_Gestionar_Escuelas;
using vudu.Logica.Fachada;
using System.Text.RegularExpressions;
using vudu.ClasesDominio;

namespace vudu.Presentacion.Presentador.VU_02_Gestionar_Escuelas
{
    public class PresentadorModificarEscuelaIndividual
    {
        public IContratoModificarEscuelaIndividual _vista;
        private EnlaceLogico _fachada;
        private String _nombre, _descripcion, _director, _telefono, _codigo, _direccion, _telefonoCompleto;
        private int _idEscuela;
        private String _mensajeExitoso = "Operación Exitosa";
        private String _mensajeErrorBd = "Operación Fallida: Error en base de datos";
        private String _mensajeErrorDatos = "Operación Fallida: Error en datos Ingresados";
        private int _longitudTelefono = 7;
        private int _longitudCodigo = 4;
        private System.Drawing.Color _colorMensajeError = System.Drawing.Color.Red;
        private System.Drawing.Color _colorMensajeExitoso = System.Drawing.Color.Green;
        private System.Drawing.Color _colorLabelBase = System.Drawing.Color.Black;
        private String _classMensajeExitoso = "transaccionExitosa";
        private String _classMensajeError = "transaccionFallida";
        private Escuela _escuela = new Escuela();
        private Universidad _uni;

     public PresentadorModificarEscuelaIndividual(IContratoModificarEscuelaIndividual vista, EnlaceLogico fachada)
        {
            _uni = (Universidad)fachada.RolActual;
            _vista = vista;
            _fachada = fachada;
            _nombre = _vista.Nombre.Text;
            _descripcion = _vista.Descripcion.Text;
            _director = _vista.Director.Text;
            _telefono = _vista.Telefono.Text;
            _codigo = _vista.Codigo.Text;
            _direccion = _vista.Direccion.Text;
            //_idEscuela = int.Parse(_vista.IdEscuela.Text);
            _vista.Usuario.Text = _uni.Nombre;
        }

        public void ConsultarEscuela(int idEscuela)
        {
            List<Escuela> listaDeEscuelas = new List<Escuela>();
            listaDeEscuelas = _fachada.ConsultarListaEscuela(_uni.Nombre);
            cargarPagina(ElegirEscuela(listaDeEscuelas, idEscuela));
        }

        public Escuela ElegirEscuela(List<Escuela> listaDeEscuelas, int idEscuelaIndividual)
        {
            _escuela = new Escuela();
            for (int i = 0; i < listaDeEscuelas.Count; i++) // 
            {

                int idEscuela = listaDeEscuelas[i].IdEscuela;
                if (idEscuela == idEscuelaIndividual)
                {
                    _escuela = listaDeEscuelas[i];
                }
            }

            return _escuela;
        }

        public void cargarPagina(Escuela escuela)//,Universidad universidad)
        {
            _vista.Nombre.Text = escuela.NombreEscuela;
            _vista.Telefono.Text = escuela.TelefonoEscuela.Substring(4, 7);
            _vista.Codigo.Text = escuela.TelefonoEscuela.Substring(0, 4);
            _vista.Descripcion.Text = escuela.DescripcionEscuela;
            _vista.Direccion.Text = escuela.DireccionEscuela;
            _vista.Director.Text = escuela.DirectorEscuela;
            _vista.IdEscuela.Text = escuela.IdEscuela+"";
            _vista.Usuario.Text = _uni.Nombre;

        }

        public int ModificarEscuela()
        {
            _nombre = _vista.Nombre.Text;
            _descripcion = _vista.Descripcion.Text;
            _director = _vista.Director.Text;
            _telefono = _vista.Telefono.Text;
            _codigo = _vista.Codigo.Text;
            _direccion = _vista.Direccion.Text;
            _idEscuela = int.Parse(_vista.IdEscuela.Text);

            if (ValidarFormulario())
            {

                _telefonoCompleto = _codigo + _telefono;
                Escuela nuevaEscuela = new Escuela(_nombre, _descripcion, _telefonoCompleto, _director, _direccion, 1);
                nuevaEscuela.IdEscuela = _idEscuela;
                _escuela = nuevaEscuela;

                int modificar = _fachada.ModificarEscuela(nuevaEscuela,_uni.Nombre);

                if (!modificar.Equals(0))
                {
                    _vista.Mensaje.Text = _mensajeExitoso;
                    _vista.Mensaje.CssClass = _classMensajeExitoso;
                    _vista.Mensaje.ForeColor = _colorMensajeExitoso;
                }
                else
                {
                    _vista.Mensaje.Text = _mensajeErrorBd;
                    _vista.Mensaje.CssClass = _classMensajeError;
                    _vista.Mensaje.ForeColor = _colorMensajeError;
                }
            }
            else
            {
                _vista.Mensaje.Text = _mensajeErrorDatos;
                _vista.Mensaje.CssClass = _classMensajeError;
                _vista.Mensaje.ForeColor = _colorMensajeError;

            }
            ConsultarEscuela(_idEscuela);
            return _idEscuela;
        }


        #region Funciones utilizadas para validar informacion del formulario

        /// <summary>
        /// Funcion que valida que la informacion del formulario este correcta
        /// </summary>
        /// <returns></returns>
        public bool ValidarFormulario()
        {
            bool respuesta = true;
            bool validaNombre = ValidarCampos(_vista.Nombre, _vista.LabelNombre, true);
            bool validaDirector = ValidarCampos(_vista.Director, _vista.LabelDirector, true);
            bool validaDescripcion = ValidarCampos(_vista.Descripcion, _vista.LabelDescripcion, false);
            bool validaDireccion = ValidarCampos(_vista.Direccion, _vista.LabelDireccion, true);
            bool validaTelefono = ValidarCampoTelefonoEscuela();

            respuesta = validaNombre && validaDirector && validaTelefono && validaDescripcion & validaDireccion;

            return respuesta;
        }

        /// <summary>
        /// Funcion que valida si la informacion del campo es correcta
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCampos(TextBox textBoxAValidar, Label labelAActivar, bool obligatorio)
        {
            String campo = textBoxAValidar.Text;
            if (obligatorio)
            {
                return ValidarObligatorio(campo, labelAActivar);
            }
            else
            {
                return ValidarOpcional(campo, labelAActivar);
            }
        }

        /// <summary>
        /// Funcion que valida los campos opcionales
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarOpcional(String campo, Label labelAActivar)
        {
            Regex regex = new Regex(@"(\s)");
            int espacios = regex.Matches(campo).Count;

            if (campo.Length == 0)
            {
                CambiarLabel(labelAActivar, true);
                return true;
            }
            if (espacios == campo.Length)
            {
                CambiarLabel(labelAActivar, false);
                return false;
            }
            else
            {
                CambiarLabel(labelAActivar, true);
                return true;
            }
        }

        /// <summary>
        /// Funcion que valida los campos obligatorios
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarObligatorio(String campo, Label labelAActivar)
        {
            Regex regex = new Regex(@"(\s)");
            int espacios = regex.Matches(campo).Count;

            if (campo.Length == 0 || espacios == campo.Length)
            {
                CambiarLabel(labelAActivar, false);
                return false;
            }
            else
            {
                CambiarLabel(labelAActivar, true);
                return true;
            }
        }

        /// <summary>
        /// Funcion que cambiar los label segun la informacion de los textbox
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public void CambiarLabel(Label aCambiar, bool validacion)
        {
            if (validacion)
            {
                aCambiar.ForeColor = _colorLabelBase;
            }
            else
            {
                aCambiar.ForeColor = _colorMensajeError;
            }
        }

        /// <summary>
        /// Funcion que valida si la informacion de Campo telefono y codigo es correcta.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCampoTelefonoEscuela()
        {

            bool validacion = true;

            if ((_telefono.Length < _longitudTelefono) || (_codigo.Length < _longitudCodigo))
            {
                validacion = validacion && false;
            }
            validacion = validacion && ValidarSiEsNumero(_telefono);
            validacion = validacion && ValidarSiEsNumero(_codigo);

            if (validacion)
            {
                CambiarLabel(_vista.LabelTelefono, true);
                return true;
            }
            else
            {
                CambiarLabel(_vista.LabelTelefono, false);
                return false;
            }
        }

        /// <summary>
        /// Funcion que valida si el valor es un numero
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarSiEsNumero(string numero)
        {
            try
            {
                Convert.ToInt32(numero);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        #endregion
    }
}